/*
 * @Author: LiZhiJian
 * @Description: 超声波测试,有待改善,可以修改为输入捕获方法
 * @Date: 2025-10-30 13:34:05
 * @LastEditTime: 2025-11-01 14:45:26
 * @Email: LiZhiJian8552@163.com
 */
#include "ultrasonicWave.h"
#include "delay.h"
#include "Movement.h"
#include "timer.h"

// 用于记录超声波从发射到接收到之间经过了多长时间
uint16_t Time; //记录时间
// 用于记录超声波测距的距离
extern uint16_t T;
int cf=0;//记录重复次数 解决bug用

void UltrasonicWave_Init(void){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    // 将PA0->TRIG,发送10us高电平,开启超声测距
    GPIO_InitTypeDef GPIO_InitStruct={0};
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
    // TODO 需要进行测试，应该修改为通用输出推挽
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);

    // 将PA1->ECHO
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
    // 可以删除?
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&GPIO_InitStruct);

    // 默认低电平,不开启超声测距
    GPIO_ResetBits(GPIOA,GPIO_Pin_0);
    
}

void UltrasonicWave_Start(void){
    // 发送高电平,开启超声测距
    GPIO_SetBits(GPIOA,GPIO_Pin_0);
    DelayUs(45);
    GPIO_ResetBits(GPIOA,GPIO_Pin_0);

    // 开启定时器计数
    Timer_Init();
}

uint16_t UltrasonicWave_Getvalue(void){
    UltrasonicWave_Start();
    Delay(100);
    return ((Time * 0.0001) * 34000) / 2;
}

void BiZhang(void){
    T=UltrasonicWave_Getvalue();
    Delay(10);

    if(T>=15){
        move_forward();
        cf++;
    }else{  //距离小于15
        T=UltrasonicWave_Getvalue();
        while(T<15){
            cf=0;
            // 一次约转30°
            move_right();
            move_right();
            Delay(10);
            T=UltrasonicWave_Getvalue();
            if(T>15){
                break;
            }
        }
    }
}
